package org.example.util;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import org.example.exception.AppException;
import org.example.model.Message;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class Util {
    private static final ObjectMapper mapper = new ObjectMapper();
    private static final MysqlDataSource DS = new MysqlDataSource();

    static{
        //设置json序列化与反序列化的日期格式
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        mapper.setDateFormat(df);
        DS.setURL("jdbc:mysql://localhost:3306/java_chatroom");
        DS.setUser("root");   //自己数据库用户名
        DS.setPassword("0627"); //自己数据库密码
        DS.setUseSSL(false);
        DS.setCharacterEncoding("UTF-8");  //解决插入数据中文乱码问题
    }

    /**
     * json序列化：java对象转为json字符串
     */
    public static String serialize(Object o){
        try{
            return mapper.writeValueAsString(o);
        }catch(JsonProcessingException e){
            throw new AppException("json序列化失败："+o,e);
        }
    }


    public static <T> T deserialize(String s, Class<T> c){
        try{
            return mapper.readValue(s,c);
        }catch(JsonProcessingException e){
            //如果出现异常，一般都是json字符串的键，在Class中没有找到对应的值
            throw new AppException("json反序列化失败：",e);
        }
    }
    /**
     * json反序列化：把json字符串转换为java对象
     */
    public static <T> T deserialize(InputStream s, Class<T> c){
        try{
            return mapper.readValue(s,c);
        }catch(IOException e){
            //如果出现异常，一般都是json字符串的键，在Class中没有找到对应的值
            throw new AppException("json反序列化失败：",e);
        }
    }

    /**
     * 获取数据库连接
     */
    public static Connection getConnection(){
        try{
            return DS.getConnection();
        }catch(SQLException e){
            throw new AppException("获取数据库连接失败",e);
        }
    }

    /**
     * 释放jdbc资源
     */
    public static void close(Connection c, Statement s, ResultSet r){
        try{
            if(c != null){
                c.close();
            }
            if(s != null){
                s.close();
            }
            if(r != null){
                r.close();
            }
        }catch(SQLException e){
            throw new AppException("释放数据库资源出错",e);
        }
    }

    public static void close(Connection c, Statement s){
        close(c,s,null);
    }

}
